Svaki programer se pre ili kasnije susretne sa situacijom u kojoj potpuno ispravan tekst odjednom postane nečitljiv. Umesto naziva grada Čačak, na ekranu se pojavi Čačak. Umesto prezimena Đorđević, dobijemo Đorđević. Na prvi pogled izgleda kao da su podaci oštećeni, baza pokvarena ili da je došlo do ozbiljne greške u sistemu.

U većini slučajeva problem je mnogo jednostavniji – reč je o pojavi poznatoj kao mojibake.

Šta je zapravo mojibake?

Mojibake je termin japanskog porekla koji označava pogrešan prikaz karaktera nastao kada se tekst zapisan u jednom kodnom rasporedu (encoding-u) pročita kao da je zapisan u drugom.

Drugim rečima, podaci su uglavnom ispravni, ali ih aplikacija tumači na pogrešan način.

Na primer, tekst:

Čačak

može biti sačuvan kao UTF-8, ali ako ga druga aplikacija pročita kao Windows-1250 ili ISO-8859-2, rezultat će biti:

Čačak

Iako izgleda kao besmislen niz znakova, originalni tekst je i dalje prisutan – samo je pogrešno interpretiran.

Zašto nastaje ovaj problem?

Računari ne čuvaju slova, već nizove bajtova. Da bi se ti bajtovi pretvorili u tekst, potrebno je znati po kom pravilu se tumače.

To pravilo naziva se encoding.

Tokom godina korišćeni su različiti standardi:

  • ASCII
  • ISO-8859-1
  • ISO-8859-2
  • Windows-1250
  • Windows-1251
  • UTF-8
  • UTF-16

Kada sistem koji koristi jedan encoding razmenjuje podatke sa sistemom koji očekuje drugi encoding, nastaje mojibake.

Gde se najčešće pojavljuje?

Migracija baza podataka

Jedan od najčešćih izvora problema su migracije između različitih sistema:

  • Access → MySQL
  • SQL Server → PostgreSQL
  • Oracle → MySQL
  • Stare aplikacije → moderne web platforme

Podaci često godinama postoje u jednoj kodnoj strani, a nova aplikacija očekuje UTF-8.

CSV i Excel fajlovi

CSV fajlovi ne sadrže informaciju o encoding-u, pa Excel često pokušava da „pogodi“ kako treba da ih pročita.

Zbog toga imena gradova, firmi ili osoba mogu završiti kao:

Niš
Bečej
Čačak

Web aplikacije

Ako server šalje podatke kao UTF-8, a stranica ih očekuje kao Windows-1250, ili obrnuto, korisnik će odmah videti pogrešne karaktere.

API integracije

Kod razmene JSON podataka između sistema, pogrešno definisan encoding može proizvesti stotine ili hiljade neispravnih zapisa.

Kako prepoznati mojibake?

Postoji nekoliko karakterističnih obrazaca:

č
ć
Å¡
ž
đ

ili:

Čačak
Niš
Bečej

Ako vidite ovakve kombinacije znakova, gotovo sigurno se radi o encoding problemu.

Da li su podaci izgubljeni?

Dobra vest je da najčešće nisu.

U ogromnom broju slučajeva podaci su potpuno očuvani. Problem je samo u načinu na koji se prikazuju.

Zato se često može izvršiti automatska konverzija i vratiti originalni tekst bez ikakvog ručnog unosa.

Kako sprečiti mojibake?

Koristite UTF-8 svuda

Danas je UTF-8 praktično univerzalni standard.

Najbolja praksa je da svi delovi sistema koriste isti encoding:

  • baza podataka
  • aplikacija
  • API
  • CSV eksport
  • Excel import
  • web stranice

Koristite utf8mb4 u MySQL-u

Za moderne aplikacije preporučuje se:

utf8mb4

jer podržava kompletan Unicode skup karaktera.

Pravilno podesite HTTP zaglavlja

Web aplikacije treba da šalju:

<meta charset="UTF-8">

i odgovarajući HTTP header.

Proverite encoding pre importa

Prilikom uvoza podataka iz:

  • Access baza
  • CSV fajlova
  • Excel dokumenata
  • starih ERP sistema

uvek proverite u kom encoding-u su podaci sačuvani pre nego što ih upišete u bazu.

Zašto je problem i dalje toliko čest?

Iako je UTF-8 danas dominantan standard, mnogi poslovni sistemi i dalje koriste tehnologije stare deset ili dvadeset godina. Stare Access baze, ERP sistemi, lokalne aplikacije i razni eksporti često rade sa Windows-1250 ili drugim regionalnim kodnim stranama.

Kada se takvi sistemi povežu sa modernim web aplikacijama, encoding problemi postaju gotovo neizbežni ukoliko se migracija ne planira pažljivo.

Mojibake nije kvar podataka već kvar njihove interpretacije. Kada vidite čudne znakove poput č, Å¡ ili đ, najverovatnije je došlo do neslaganja između encoding-a u kojem su podaci sačuvani i encoding-a u kojem se prikazuju.

Zbog toga je jedno od najvažnijih pravila savremenog razvoja softvera:

Koristite UTF-8 od početka do kraja sistema i proveravajte encoding pri svakoj razmeni podataka.

Na taj način izbeći ćete jedan od najupornijih i najčešćih problema sa tekstualnim podacima u programiranju.

Pristupačnost